package com.acxy.ants.core.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 *
 * @author MrShun
 * @version 1.0
 * @Date 2017-05-02
 */
public class JDKProxy implements InvocationHandler {

    protected static Object target; // 代理目标

    private JDKProxy() {

    }

    /**
     * 通过Class来生成动态代理对象Proxy
     *
     * @param clazz
     * @return
     */
    public static <T> T createProxy(Class<T> clazz) throws IllegalAccessException, InstantiationException {
        if (target == null) {
            synchronized (JDKProxy.class) {  //在代码块中加同步锁 如果已经有线程访问 当前线程转为阻塞状态
                if (target == null) { //当第二个线程访问时 已经不为null了 那么不再创建对象
                    target = clazz.newInstance();
                }
            }

        }
        return (T) Proxy.newProxyInstance(clazz.getClassLoader(),
                clazz.getInterfaces(), new JDKProxy());
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //调用前验证权限(动态添加其他要执行业务)
        System.out.println("//调用前验证权限(动态添加其他要执行业务)");

        Object result = method.invoke(proxy, args); // 执行业务处理
        //记录日志数据(动态添加其他要执行业务)
        System.out.println("//记录日志数据(动态添加其他要执行业务)");
        return result;
    }

}
